Pipe [system call]

공유된 커널 영역을 사용해서 프로세스 간의 통신을 위한 방법(FILE은 커널 영역을 사용하지는 않음)
가상 메모리에서는 서로 다른 영역을 할당 받은 것처럼 보이나,
물리 메모리 상에서는 서로 같은 영역을 공유하고 있다.
PIPE(파이프) <unistd.h>
기본 파이프는 단방향 통신(부모->자식, 자식->부모)
fork()로 자식 프로세스 만들었을 때, 부모와 자식간의 통신

부모와 자식간의 통신만 가능함

pipe(int fd[2])
write(int fd[1], char* msg, size_t MSGSIZE)
int read(int fd[0], char* buf, size_t MSGSIZE)        //buf size return
만일 pipe로 양방향 통신을 설계할 경우, 순서가 서로 꼬여서 부모프로세스에서 쓰고, 읽는 등 동작을 제대로 안할 수 있다.

위와 같이 두개의 pipe를 생성해서 단방향으로 통신해야 한다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MSGSIZE 255
char* msg="Hello Child Process";
int main(void){
char buf[255];
int fd[2], pid, nbytes;
if(pipe(fd)<0)exit(1); // ( )
pid=fork();
if(pid>0){
printf("parent PID:%d, child PID:%d\n", getpid(), pid);
write(fd[1], msg, MSGSIZE);
exit(0);
}else{
printf("child PID:%d\n", getpid());
nbytes=read(fd[0], buf, MSGSIZE);
printf("%d %s\n", nbytes, buf);
exit(0);
}
return 0;
}

celina@ubuntuserver:~/celina/test$ ./pipe_test

parent PID:3194, child PID:3195

child PID:3195

255 Hello Child Process